\chapter{Trabalhos Relacionados} \label{cap:trabrel}

O modelo CGW \cite{Chen2008}, assim como o modelo BCR+, foi proposto para modelar o crescimento, vértice a vértice, de redes de dependências extraídas de sistemas de software. Diferentemente do BCR+, o modelo CGW incorpora operações de remoção e religamento de arestas, que espelham a atividade de refatoração de programas. O modelo BCR+, em contrapartida, pode simular a evolução de um sistema de software sujeito a restrições na interação entre módulos, como ocorre na implementação de sistemas a partir de um \emph{design} pré-estabelecido.

Stopford e Counsell propuseram um arcabouço para simular a evolução estrutural de sistemas de software \cite{Stopford2008}. O arcabouço incorpora conceitos como requisitos, desenvolvedores, métricas de código e base de código. Em simulações realizadas com o arcabouço, a exemplo do que ocorre em sistemas reais, o tamanho do código cresce linearmente ao longo do tempo. Não há qualquer discussão, no entanto, sobre a distribuição estatística das dependências entre entidades nas bases de código geradas pelo arcabouço.

Gunqun, Lin e Li investigaram a estrutura de 138 redes de software extraídas de programas escritos em Java \cite{Gunqun2008}. Ao analisar a similaridade entre as redes, medida pela correlação entre os perfis de concentração de tríades (PCTs), eles concluíram que as redes podiam ser divididas em três grupos, de acordo com a similaridade. Redes grandes, com mais de 400 entidades, apresentaram grande similaridade entre si, e foram todas classificadas no mesmo grupo. Os autores não mediram, no entanto, a similaridade entre redes de software e redes de outros domínios, como foi feito no Capítulo \ref{cap:classificacao} deste documento.

Com o propósito de avaliar algoritmos de agrupamento no contexto de redes sociais, Lancichinetti e Fortunato aplicaram 12 algoritmos de agrupamento a redes geradas pelo modelo LFR \cite{Lancichinetti2009b}. Em particular, foi estudada a relação entre a proporção de arestas externas --- determinado pelo coeficiente de mistura --- e o desempenho dos algoritmos. Os demais parâmetros do modelo foram fixados em valores arbitrários, que não estão associados a nenhum domínio em particular (redes sociais, redes de software etc.). Como espera-se que os resultados variem de acordo com os parâmetros utilizados, as conclusões do estudo não são imediatamente aplicáveis a nenhum domínio específico, e nem são generalizáveis para todos os domínios. A arbitrariedade dos valores dos parâmetros pode ser reduzida através de um estudo como o que foi realizado no Capítulo \ref{cap:avaliacao}.

O algoritmo de agrupamento Bunch foi avaliado por seus criadores através de sua aplicação a redes geradas aleatoriamente, variando o número de arestas \cite{Mitchell2007}. Os autores do estudo encontraram uma grande variação no número de módulos encontrados pelo algoritmo para as redes mais densas, o que não ocorreu em redes esparsas. A julgar pelo fato de que o modelo de geração de redes aleatórias não foi discutido pelos autores, no entanto, é provável que não tenha sido escolhido um modelo livre de escala, o que compromete a generalização das conclusões para o domínio de sistemas de software. 
%%  verificar eu próprio a conclusão de Mitchell sobre redes densas/esparsas.

No nosso conhecimento, este é o primeiro trabalho sobre geração automática de dependências de software realistas.

% Wu, Hassan e Holt \cite{Wu2005} avaliaram os algoritmos Bunch, ACDC e algoritmos aglomerativos comparando, através da métrica MoJo, os agrupamentos encontrados pelos algoritmos com agrupamentos de referência de 5 sistemas de software em C e C++, representados como um grafo dos arquivos fonte e dependências estáticas entre os arquivos. Os agrupamentos de referência foram obtidos automaticamente a partir de uma análise da estrutura de diretórios dos sistemas. Cada diretório contendo pelo menos 5 arquivos fonte foi considerado um módulo do sistema. Bittencourt e Guerrero \cite{Bittencourt2009} realizaram um experimento semelhante, porém avaliando algoritmos de agrupamento estudados em outros domínios aplicados sobre um conjunto de 4 sistemas em Java. Ao contrário do que ocorre no estudo do Capítulo \ref{cap:estudo}, em nenhum dos dois estudos se procurou entender quais características das redes influenciam o desempenho dos algoritmos.

